#include <pthread.h>
#include <iostream>
#include <string>
#include <unistd.h>

// int count = 1; // 全局变量本身就是被两个变量共享的
// 加__thread修饰叫做线程的局部存储, 
// 两个线程访问的不是同一个地址，而是各自的局部存储的地址
__thread int count = 1; 
// 为什么要有局部存储? 
// 1.不想让定义的全局变量被其他线程使用
// 2. 线程局部存储只能存储内置类型和部分指针

std::string Addr(int &c)
{
    char addr[64];
    snprintf(addr, sizeof(addr), "%p", &c);
    return addr;
}


void *routine1(void *args)
{
    (void)args;
    while (true)
    {
        std::cout << "thread-1, count = " << count << " [我来修改count]" 
            << ", &count: " << Addr(count) << std::endl;
        count++;
        sleep(1);
    }
}

void *routine2(void *args)
{
    (void)args;
    while (true)
    {
        sleep(1);
        std::cout << "thread-2, count = " << count << " [我来打印count]" 
            << ", &count: " << Addr(count)<< std::endl;
    }
}

int main()
{
    pthread_t tid1, tid2;
    pthread_create(&tid1, nullptr, routine1, nullptr);
    pthread_create(&tid2, nullptr, routine2, nullptr);

    pthread_join(tid1, nullptr);
    pthread_join(tid2, nullptr);

    return 0;
}